import com.google.common.collect.Iterators;
import com.google.common.collect.Ordering;


import java.util.*;

public class Test {
    public static void main(String[] args) {

        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("qzhm", "14238001");
        map1.put("zzhm", "14238002");
        map1.put("sl", "2");
        map1.put("fpzldm", "000008101200");
        map1.put("jldwdm", "6500164320");
        Map<String, String> map2 = new HashMap<String, String>();
        map2.put("qzhm", "14238003");
        map2.put("zzhm", "14238004");
        map2.put("sl", "2");
        map2.put("fpzldm", "000008101200");
        map2.put("jldwdm", "6500164320");
        Map<String, String> map3 = new HashMap<String, String>();
        map3.put("qzhm", "14238005");
        map3.put("zzhm", "14238009");
        map3.put("sl", "5");
        map3.put("fpzldm", "000008101200");
        map3.put("jldwdm", "6500164320");
        Map<String, String> map4 = new HashMap<String, String>();
        map4.put("qzhm", "14238015");
        map4.put("zzhm", "14240000");
        map4.put("sl", "1986");
        map4.put("fpzldm", "000008101200");
        map4.put("jldwdm", "6500164320");
        Map<String, String> map5 = new HashMap<String, String>();
        map5.put("qzhm", "02254001");
        map5.put("zzhm", "02254014");
        map5.put("sl", "14");
        map5.put("fpzldm", "1130");
        map5.put("jldwdm", "6500172130");
        Map<String, String> map6 = new HashMap<String, String>();
        map6.put("qzhm", "02254015");
        map6.put("zzhm", "02256000");
        map6.put("sl", "1986");
        map6.put("fpzldm", "1130");
        map6.put("jldwdm", "6500172130");
        Map<String, String> map7 = new HashMap<String, String>();
        map7.put("qzhm", "14238010");
        map7.put("zzhm", "14238014");
        map7.put("sl", "5");
        map7.put("fpzldm", "000008101200");
        map7.put("jldwdm", "6500164320");
        Map<String, String> map8 = new HashMap<String, String>();
        map8.put("qzhm", "9");
        map8.put("zzhm", "10");
        map8.put("sl", "2");
        map8.put("fpzldm", "000008101200");
        map8.put("jldwdm", "6500164320");
        Map<String, String> map9 = new HashMap<String, String>();
        map9.put("qzhm", "9");
        map9.put("zzhm", "10");
        map9.put("sl", "2");
        map9.put("fpzldm", "1130");
        map9.put("jldwdm", "6500172130");
        Map<String, String> map10 = new HashMap<String, String>();
        map10.put("qzhm", "20");
        map10.put("zzhm", "22");
        map10.put("sl", "3");
        map10.put("fpzldm", "1130");
        map10.put("jldwdm", "6500172130");
        Map<String, String> map11 = new HashMap<String, String>();
        map11.put("qzhm", "11");
        map11.put("zzhm", "12");
        map11.put("sl", "2");
        map11.put("fpzldm", "000008101200");
        map11.put("jldwdm", "6500164320");
        Map<String, String> map12 = new HashMap<String, String>();
        map12.put("qzhm", "110");
        map12.put("zzhm", "112");
        map12.put("sl", "3");
        map12.put("fpzldm", "000008101200");
        map12.put("jldwdm", "6500164320");
        Map<String, String> map13 = new HashMap<String, String>();
        map13.put("qzhm", "113");
        map13.put("zzhm", "114");
        map13.put("sl", "2");
        map13.put("fpzldm", "000008101200");
        map13.put("jldwdm", "6500164320");



        List<Map<String, String>> list = new ArrayList<Map<String,String>>();
        list.add(map4);
        list.add(map2);
        list.add(map3);
        list.add(map6);
        list.add(map1);
        list.add(map5);
        list.add(map7);
        list.add(map8);
        list.add(map9);
        list.add(map10);
        list.add(map11);
        list.add(map12);
        list.add(map13);

        System.out.println(list);

        List<String> fpzldmList = new ArrayList<>();

        //首先 发票种类获取到
        for (int i = 0;i<list.size();i++){

            if(i == 0){
                fpzldmList.add(list.get(i).get("fpzldm"));
                continue;
            }

            if (!fpzldmList.contains(list.get(i).get("fpzldm"))){
                fpzldmList.add(list.get(i).get("fpzldm"));
            }
        }

        //相同发票种类合并成list
        Map<String,List<Map<String,String >>> stringListMap = new HashMap<>();
        for (int i = 0; i < fpzldmList.size(); i++) {
            List tempList = new ArrayList();
            for (int j = 0; j < list.size(); j++) {
                if (fpzldmList.get(i).equals(list.get(j).get("fpzldm"))){
                    tempList.add(list.get(j));
                }
                stringListMap.put(fpzldmList.get(i),tempList);
            }
        }


        Comparator<Map<String,String>> userComparator = Ordering
                .from(new QshmComparator());
        //排序
        for (int i = 0; i < fpzldmList.size(); i++) {
            Collections.sort(stringListMap.get(fpzldmList.get(i)), userComparator);
        }


        List<Map<String,String>> resultList = new ArrayList<>();
        int qshm,zzhm,sl ,newsl;

        for (int i = 0; i < fpzldmList.size(); i++) {
            for (int j = 1; j < stringListMap.get(fpzldmList.get(i)).size(); j++) {

                if(Integer.valueOf(stringListMap.get(fpzldmList.get(i)).get(j-1).get("zzhm"))+1 == Integer.valueOf(stringListMap.get(fpzldmList.get(i)).get(j).get("qzhm"))){
                    zzhm = Integer.valueOf(stringListMap.get(fpzldmList.get(i)).get(j).get("zzhm"));
                    qshm = Integer.valueOf(stringListMap.get(fpzldmList.get(i)).get(j-1).get("qzhm"));
                    sl = Integer.valueOf(stringListMap.get(fpzldmList.get(i)).get(j-1).get("sl"));
                    newsl = Integer.valueOf(stringListMap.get(fpzldmList.get(i)).get(j).get("sl"));
                    stringListMap.get(fpzldmList.get(i)).get(j-1).put("zzhm",zzhm + "");
                    stringListMap.get(fpzldmList.get(i)).get(j).put("qzhm",qshm + "");
                    stringListMap.get(fpzldmList.get(i)).get(j).put("sl",sl + newsl + "");
                }else{
                    resultList.add(stringListMap.get(fpzldmList.get(i)).get(j-1));
                }

                if (j == stringListMap.get(fpzldmList.get(i)).size()-1)
                    resultList.add(stringListMap.get(fpzldmList.get(i)).get(stringListMap.get(fpzldmList.get(i)).size() -1));
            }

        }


//        for (int i = 0; i < fpzldmList.size(); i++) {
//            Map<String,String> tempMap = new HashMap<>();
//            PeekingIterator<Map<String,String>> iter = Iterators.peekingIterator(stringListMap.get(fpzldmList.get(i)).iterator());
//            Map<String,String> current=null;
//            while (iter.hasNext()) {
//
//            }

//            while (iter.hasNext()){
//                Map<String,String> current = iter.next();
//                if(!iter.hasNext()){
//                    int current_zzhm = Integer.valueOf(tempMap.get("zzhm"));
//                    int current_sl = Integer.valueOf(tempMap.get("sl"));
//
//                    int next_qshm = Integer.valueOf(current.get("qzhm"));
//                    int next_sl = Integer.valueOf(current.get("sl"));
//                    if (current_zzhm+1 == next_qshm){
//                        if(tempMap.get("sl") == null ){
//                            tempMap = current;
//                            tempMap.put("sl","0");
//                        }
//
//                        tempMap.put("sl",  next_sl + current_sl + "");
//                        tempMap.put("zzhm",current.get("zzhm"));
//                    }
//
//                }else{
//                    Map<String,String> next = iter.peek();
//                    int current_zzhm = Integer.valueOf(current.get("zzhm"));
//                    int current_sl = Integer.valueOf(current.get("sl"));
//
//                    int next_qshm = Integer.valueOf(next.get("qzhm"));
//                    int next_sl = Integer.valueOf(next.get("sl"));
//
//                    if (current_zzhm+1 == next_qshm){
//                        if(tempMap.get("sl") == null ){
//                            tempMap = current;
//                            tempMap.put("sl","0");
//                        }
//                        int tempMap_sl = tempMap.get("sl") == null ? 0:Integer.valueOf(tempMap.get("sl"));
//                        tempMap.put("sl", tempMap_sl + next_sl + current_sl + "");
//                        tempMap.put("zzhm",next.get("zzhm"));
//                        iter.next();
//                    }else {
//                        resultList.add(current);
//                        tempMap = next;
//                        iter.next();
//                    }
//                }
//
//
//            }
//                resultList.add(tempMap);
//        }

        System.out.println(fpzldmList);
        System.out.println(stringListMap);
        System.out.println(resultList);
//        Zhaoyang t = new Zhaoyang();
//        t.test(list);

//        Map<String, List<Map<String, String>>> zzMap = split(list);
//
//
//        for (Map.Entry<String, List<Map<String, String>>> entry : zzMap.entrySet()) {
//            List<Map<String, String>> ml = entry.getValue();
//            List<Map<String, String>> newml = merge(ml);
//
//            //加入其他字段
//            for (Map.Entry<String, String> map : ml.get(0).entrySet()) {
//                String key = map.getKey();
//                String value = map.getValue();
//                if (!key.equals("qzhm") && !key.equals("zzhm") && !key.equals("sl")) {
//                    for (Map<String, String> newMap : newml) {
//                        newMap.put(key, value);
//                    }
//                }
//            }
//
//            //计算count
//            if (1 == newml.size()) {
//                int count = 0;
//                for (Map<String, String> m : ml) {
//                    count += Integer.valueOf(m.get("sl"));
//                }
//                newml.get(0).put("sl", String.valueOf(count));
//            } else {
//                for (Map<String, String> nm : newml) {
//                    int count = 0;
//                    int qzhm = Integer.valueOf(nm.get("qzhm"));
//                    int zzhm = Integer.valueOf(nm.get("zzhm"));
//                    for (Map<String, String> m : ml) {
//                        int mQsHm = Integer.valueOf(m.get("qzhm"));
//                        int mZzHm = Integer.valueOf(m.get("zzhm"));
//                        int mCount = Integer.valueOf(m.get("sl"));
//                        if (mQsHm >= qzhm && mZzHm <= zzhm) {
//                            count += mCount;
//                        }
//                    }
//                    nm.put("sl", String.valueOf(count));
//                }
//            }
//            System.out.println(newml);
//        }
//    }
//
//    private static List<Map<String, String>> test(Map<String, List<Map<String, String>>> zzMap){
//        List<Map<String, String>> allList = new ArrayList<Map<String,String>>();
//        for (Map.Entry<String, List<Map<String, String>>> entry : zzMap.entrySet()) {
//            List<Map<String, String>> ml = entry.getValue();
//            List<Map<String, String>> newml = merge(ml);
//
//            //加入其他字段
//            for (Map.Entry<String, String> map : ml.get(0).entrySet()) {
//                String key = map.getKey();
//                String value = map.getValue();
//                if (!key.equals("qzhm") && !key.equals("zzhm") && !key.equals("sl")) {
//                    for (Map<String, String> newMap : newml) {
//                        newMap.put(key, value);
//                    }
//                }
//            }
//
//            //计算count
//            if (1 == newml.size()) {
//                int count = 0;
//                for (Map<String, String> m : ml) {
//                    count += Integer.valueOf(m.get("sl"));
//                }
//                newml.get(0).put("sl", String.valueOf(count));
//            } else {
//                for (Map<String, String> nm : newml) {
//                    int count = 0;
//                    int qzhm = Integer.valueOf(nm.get("qzhm"));
//                    int zzhm = Integer.valueOf(nm.get("zzhm"));
//                    for (Map<String, String> m : ml) {
//                        int mQsHm = Integer.valueOf(m.get("qzhm"));
//                        int mZzHm = Integer.valueOf(m.get("zzhm"));
//                        int mCount = Integer.valueOf(m.get("sl"));
//                        if (mQsHm >= qzhm && mZzHm <= zzhm) {
//                            count += mCount;
//                        }
//                    }
//                    nm.put("sl", String.valueOf(count));
//                }
//            }
//            allList.addAll(newml);
//            System.out.println(newml);
//        }
//        return allList;
//    }
//
//    /**
//     * 根据种类代码拆分
//     * @param list
//     * @return
//     */
//    private static Map<String, List<Map<String, String>>> split(List<Map<String, String>> list) {
//        List<String> zldmList = new ArrayList<String>();	//存放种类代码的
//        Map<String, List<Map<String, String>>> zzMap = new HashMap<String, List<Map<String, String>>>();
//        for (int i = 0; i < list.size(); i ++) {
//            Map<String, String> map = list.get(i);	//遍历的每一个map
//            String zldm = map.get("fpzldm");
//            if (0 == i) {	//第一个map就直接把种类代码存入zldmList
//                zldmList.add(zldm);
//                List<Map<String, String>> ml = new ArrayList<Map<String, String>>();
//                ml.add(map);
//                zzMap.put(zldm, ml);
//            } else {
//                for (int j = 0; j < zldmList.size(); j ++) {
//                    String zldms = zldmList.get(j);
//                    if (zldms.equals(zldm)) {	//如果种类代码在zldmList已存在，则加入zzMap中相应的list里
//                        List<Map<String, String>> ml = zzMap.get(zldm);
//                        ml.add(map);
//                        zzMap.put(zldm, ml);
//                        break;
//                    } else if (j == (zldmList.size() - 1)) {	//如果不存在，且遍历到最后一个，则new一个list存入zzMap
//                        zldmList.add(zldm);
//                        List<Map<String, String>> ml = new ArrayList<Map<String, String>>();
//                        ml.add(map);
//                        zzMap.put(zldm, ml);
//                        break;
//                    }
//                }
//            }
//        }
//        return zzMap;
//    }
//
//    /**
//     * 根据起止号码合并
//     * @param list
//     * @return
//     */
//    private static List<Map<String, String>> merge(List<Map<String, String>> list) {
//        List<Map<String, String>> finalList = new ArrayList<Map<String, String>>();
//        if (1 == list.size()) {
//            Map<String, String> finalMap = new HashMap<String, String>();
//            finalMap.put("qzhm", list.get(0).get("qzhm"));
//            finalMap.put("zzhm", list.get(0).get("zzhm"));
//            finalList.add(finalMap);
//        } else {
//            int listLength = list.size();
//            int arrLength = listLength * 2;
//            int[] arr = new int[arrLength];
//            for (int i = 0; i < listLength; i ++) {	//把所有的起始号码和终止号码放在数组中
//                arr[i] = Integer.valueOf(list.get(i).get("qzhm"));
//                arr[arrLength - 1 - i] = Integer.valueOf(list.get(i).get("zzhm"));
//            }
//            Arrays.sort(arr);
//            for (int i = 2; i < arr.length; i ++) {	//把排好序的数组按照规则进行合并，并把合并了的元素做标记
//                int pre = arr[i - 1];
//                int now = arr[i];
//                if (pre + 1 == now) {
//                    arr[i - 1] = -666;	//这里的-666只是为了标记，是要移出的项
//                    arr[i] = -666;
//                }
//            }
//            List<Integer> newList = new ArrayList<Integer>();
//            for (int i = 0; i < arr.length; i ++) {	//把未被标记的数组元素放在一个新的ArrayList中
//                if (-666 != arr[i]) {
//                    newList.add(arr[i]);
//                }
//            }
//            for (int i = 0; i < newList.size(); i ++) {	//把新的ArrayList中的元素重新封装成map，并放在最终的ArrayList中
//                if (0 == i % 2) {
//                    Map<String, String> finalMap = new HashMap<String, String>();
//                    finalMap.put("qzhm", String.valueOf(newList.get(i)));
//                    finalMap.put("zzhm", String.valueOf(newList.get(i + 1)));
//                    finalList.add(finalMap);
//                }
//            }
//        }
//        return finalList;
//    }
}
}
